package com.tesisutn.restsoft.dominio.pedido;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import com.tesisutn.restsoft.dominio.caja.Cobro;
import com.tesisutn.restsoft.dominio.cliente.Cliente;
import com.tesisutn.restsoft.dominio.empleado.Empleado;
import com.tesisutn.restsoft.dominio.interfaces.ObjetoDeDominio;
import com.tesisutn.restsoft.dominio.pedido.estadosDetalle.EstadoDetalleDePedido;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Pedido implements ObjetoDeDominio{
	@Id
    @GeneratedValue
	private Long id;
    private Date fecha;
    @OneToMany(mappedBy="pedido")
    private Set<DetalleDePedido> detalles;
    @ManyToOne
    private Cliente cliente;
    private String observaciones;
    @ManyToOne
    private TipoDeDescuento tipoDeDescuento;
    @ManyToOne
    private Empleado empleado;
    @ManyToOne
    private Cobro cobro;

    public Pedido(){
        detalles = new HashSet<DetalleDePedido>();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    
    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Double getSubtotal() {
        Double resultado = 0.0;
        for(DetalleDePedido detalle : detalles){
            if(detalle.getDetalleEstado().getEstado() != EstadoDetalleDePedido.Anulado && detalle.getDetalleEstado().getEstado() != EstadoDetalleDePedido.Cancelado)
                resultado += detalle.getSubtotal();
        }
        return resultado;
    }

    public Double getDescuento() {
        Double descuento = 0.0;
        if(tipoDeDescuento != null)
            descuento = getSubtotal() * tipoDeDescuento.getPorcentaje() / 100;
        return descuento;
    }

    public Double getTotal() {
        Double resultado = getSubtotal();
        resultado = resultado - getDescuento();
        return resultado;
    }

    
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public void addDetalle(DetalleDePedido detalle){
        detalles.add(detalle);
        detalle.setPedido(this);
    }

    public void removeDetalle(DetalleDePedido detalle){
        detalles.remove(detalle);
        detalle.setPedido(null);
    }

    public Iterable<DetalleDePedido> getDetalles(){
        return detalles;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public TipoDeDescuento getTipoDeDescuento() {
        return tipoDeDescuento;
    }

    public void setTipoDeDescuento(TipoDeDescuento tipoDeDescuento) {
        this.tipoDeDescuento = tipoDeDescuento;
    }

    public Empleado getEmpleado() {
        return empleado;
    }

    public void setEmpleado(Empleado empleado) {
        this.empleado = empleado;
    }

    public Cobro getCobro() {
        return cobro;
    }

    public void setCobro(Cobro cobro) {
        this.cobro = cobro;
    }
}
